{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multi-Modal Genre Classification for Movies\n",
    "### Given:\n",
    "- A data point  xixi \n",
    "- A set of categories  y1,y2...yny1,y2...yn  that  xixi  can belong to. \n",
    "\n",
    "### Task :\n",
    "Predict the correct category **yk**  for a new data point  **xk**  not present in the given dataset.\n",
    "### Problem :\n",
    "We don't know how the  **x**  and  **y**  are related mathematically.\n",
    "### Assumption :\n",
    "We assume there exists a function  ff  relating  xx  and  yy  i.e.  f(xi)=yif(xi)=yi \n",
    "### Approach :\n",
    "Since  ff  is not known, we learn a function  gg , which approximates  ff .\n",
    "### Important consideration :\n",
    "- If  **f(xi)=g(xi)=y**  for all  **xi** , then the two functions  **f** and  **g**  are exactly equal. Needless to say, this won't realistically ever happen, and we'll only be able to approximate the true function  **f**  using  **g** . This means, sometimes the prediction **g(xi)**  will not be correct. And essentially, our whole goal is to find a  **g**  which makes a really low number of such errors. That's basically all that we're trying to do.\n",
    "- For the sake of completeness, I should mention that this is a specific kind of learning problem which we call \"Supervised Learning\". Also, the idea that  gg  approximates  ff  well for data not present in our dataset is called \"Generalization\". It is absolutely paramount that our model generalizes, or else all our claims will only be true about data we already have and our predictions will not be correct.\n",
    "- Finally, There are several other kinds, but supervised learning is the most popular and well studied kind.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### What's Multi-Modal Classification then?\n",
    "In the machine learning community, the term Multi-Modal is used to refer to multiple kinds of data. For example, consider a YouTube video. It can be thought to contain 3 different modalities -\n",
    "The video frames (visual modality)\n",
    "The audio clip of what's being spoken (audio modality)\n",
    "Some videos also come with the transcription of the words spoken in the form of subtitles (textual modality)\n",
    "Consider, that I'm interested in classifying a song on YouTube as pop or rock. You can use any of the above 3 modalities to predict the genre - The video, the song itself, or the lyrics. But, needless to say, you can predict it much better if you could use all three simultaneously. This is what we mean by multi-modal classification."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Building your very own DataSet\n",
    "For any machine learning algorithm to work, it is imperative that we collect data which is \"representative\". \n",
    "\n",
    "### What do we mean by data being \"representative\"?\n",
    "Let's look at this from first principles. Mathematically, the premise of machine learning is that given input vairable X, and output variable y, **IF** there is a funcation such that **g(X)=y**, then if **g** is unknown, we can \"learn\" a fun For example, if you're trying to predict someone's movie preferences then X can be information about the person's gender, age, nationality and so on, while y can be the genre they most like to listen to!ction **f** which approximates **g**. At the very heart, its not at all different from what you may have earlier studied as \"curve fitting\". For example, if you're trying to predict someone's movie preferences then X can be information about the person's gender, age, nationality and so on, while y can be the genre they most like to listen to!\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Scraping data from 2 different movie sources - IMDB and TMDB\n",
    "\n",
    "#### IMDB:http://www.imdb.com/\n",
    "For those unaware, IMDB is the primary source of information about movies on the internet. It is immensely rich with posters, reviews, synopsis, ratings and many other information on every movie. We will use this as our primary data source.\n",
    "#### TMDB:https://www.themoviedb.org/\n",
    "TMDB, or The Movie DataBase, is an open source version of IMDB, with a free to use API that can be used to collect information. You do need an API key, but it can be obtained for free by just making a request after making a free account.\n",
    "#### Note -\n",
    "IMDB gives some information for free through the API, but doesn't release other information about movies. Here, we will keep it legal and only use information given to us for free and legally. However, scraping does reside on the moral fence, so to say. People often scrape data which isn't exactly publicly available for use from websites.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import urllib2 \n",
    "import requests \n",
    "import json\n",
    "import imdb\n",
    "import time\n",
    "import itertools\n",
    "import wget\n",
    "import os\n",
    "import tmdbsimple as tmdb\n",
    "import numpy as np \n",
    "import random\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt \n",
    "%matplotlib inline \n",
    "import seaborn as sns\n",
    "import pickle "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Folder already exists\n"
     ]
    }
   ],
   "source": [
    "# set here the path where you want the scrapped folders to be saved!\n",
    "poster_folder = 'posters_final/'\n",
    "if poster_folder.split('/')[0] in os.listdir('./'):\n",
    "    print('Folder already exists')\n",
    "else:\n",
    "    os.mkdir('./' + poster_folder)\n",
    "    print('Folder Created')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# For the purpose of this example, i will be working with the 1999 Sci-Fi movie - \"The Matrix\"!\n",
    "#Enter your own API key here to run the code below. \n",
    "api_key='ced76d9cf645f6f902af7d092bdcacfe'\n",
    "\n",
    "tmdb.API_KEY = api_key\n",
    "\n",
    "#this instantiates a tmdb \"search\" object which allows your to search for the movie\n",
    "search = tmdb.Search() \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Functions goes here\n",
    "def grab_poster_tmdb(movie):\n",
    "    response = search.movie(query=movie)\n",
    "    id=response['results'][0]['id']\n",
    "    movie = tmdb.Movies(id)\n",
    "    posterp=movie.info()['poster_path']\n",
    "    title=movie.info()['original_title']\n",
    "    url='image.tmdb.org/t/p/original'+posterp\n",
    "    title='_'.join(title.split(' '))\n",
    "    strcmd='wget -O '+poster_folder+title+'.jpg '+url\n",
    "    os.system(strcmd)\n",
    "    #print(response['results'])\n",
    "    \n",
    "def get_movie_id_tmdb(movie):\n",
    "    response = search.movie(query=movie)\n",
    "    movie_id=response['results'][0]['id']\n",
    "    return movie_id\n",
    "\n",
    "def get_movie_info_tmdb(movie):\n",
    "    response = search.movie(query=movie)\n",
    "    movie_id=response['results'][0]['id']\n",
    "    movie=tmdb.Movies(movie_id)\n",
    "    info = movie.info()\n",
    "    return info\n",
    "\n",
    "def get_movie_genres_tmdb(movie):\n",
    "    response=search.movie(query=movie)\n",
    "    id=response['results'][0]['id']\n",
    "    movie=tmdb.Movies(id)\n",
    "    genres=movie.info()['genres']\n",
    "    return genres\n",
    "\n",
    "\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "While the above functions have been made to make it easy to get genres, posters and ID, all the information that can be accessed can be seen by calling the function get_movie_info() as shown below.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{u'id': 18, u'name': u'Drama'}]\n",
      "[{u'id': 28, u'name': u'Action'}, {u'id': 878, u'name': u'Science Fiction'}]\n"
     ]
    }
   ],
   "source": [
    "print get_movie_genres_tmdb('Fight club')\n",
    "print get_movie_genres_tmdb(\"The Matrix\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "All the Movie information from TMDB gets stored in a dictionary with the following keys for easy access -\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[u'poster_path',\n",
       " u'production_countries',\n",
       " u'revenue',\n",
       " u'overview',\n",
       " u'video',\n",
       " u'id',\n",
       " u'genres',\n",
       " u'title',\n",
       " u'tagline',\n",
       " u'vote_count',\n",
       " u'homepage',\n",
       " u'belongs_to_collection',\n",
       " u'original_language',\n",
       " u'status',\n",
       " u'spoken_languages',\n",
       " u'imdb_id',\n",
       " u'adult',\n",
       " u'backdrop_path',\n",
       " u'production_companies',\n",
       " u'release_date',\n",
       " u'popularity',\n",
       " u'original_title',\n",
       " u'budget',\n",
       " u'vote_average',\n",
       " u'runtime']"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "info=get_movie_info_tmdb(\"The Matrix\")\n",
    "print \"All the Movie information from TMDB gets stored in a dictionary with the following keys for easy access -\"\n",
    "info.keys()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So, to get the tagline of the movie we can use the above dictionary key -"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Matrix Tag Line:Welcome to the Real World.\n"
     ]
    }
   ],
   "source": [
    "print('Matrix Tag Line:' + info['tagline'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Time to get movie information from IMDB\n",
    "Now that we know how to get information from TMDB, here's how we can get information about the same movie from imdb. This makes it possible for us to combine more information, and get a richer dataset. I urge you to try and see what dataset you can make, and go above and beyond the basic things I've done in this tutorial. Due to the differences between the two datasets, you will have to do some cleaning, however both of these datasets are extremely clean and it will be minimal."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "All the information we can get about this movie from IMDB-\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[u'music department',\n",
       " 'sound crew',\n",
       " 'camera and electrical department',\n",
       " u'distributors',\n",
       " 'rating',\n",
       " 'runtimes',\n",
       " 'costume designer',\n",
       " 'make up',\n",
       " 'year',\n",
       " 'production design',\n",
       " 'miscellaneous crew',\n",
       " 'color info',\n",
       " u'casting department',\n",
       " 'languages',\n",
       " 'votes',\n",
       " 'producer',\n",
       " 'title',\n",
       " 'mpaa',\n",
       " 'assistant director',\n",
       " 'writer',\n",
       " 'production manager',\n",
       " 'casting director',\n",
       " 'visual effects',\n",
       " 'top 250 rank',\n",
       " 'set decoration',\n",
       " 'editor',\n",
       " 'certificates',\n",
       " u'costume department',\n",
       " 'country codes',\n",
       " 'language codes',\n",
       " 'cover url',\n",
       " u'special effects department',\n",
       " 'special effects companies',\n",
       " 'sound mix',\n",
       " u'location management',\n",
       " 'genres',\n",
       " 'director',\n",
       " 'stunt performer',\n",
       " 'miscellaneous companies',\n",
       " 'cinematographer',\n",
       " 'art direction',\n",
       " 'akas',\n",
       " 'aspect ratio',\n",
       " u'production companies',\n",
       " 'kind',\n",
       " u'art department',\n",
       " 'countries',\n",
       " u'transportation department',\n",
       " 'plot outline',\n",
       " 'plot',\n",
       " 'cast',\n",
       " u'animation department',\n",
       " 'original music',\n",
       " u'editorial department',\n",
       " 'canonical title',\n",
       " 'long imdb title',\n",
       " 'long imdb canonical title',\n",
       " 'smart canonical title',\n",
       " 'smart long imdb canonical title',\n",
       " 'full-size cover url']"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Create the IMDB object that will be used to access the IMDb's database\n",
    "imdb_object = imdb.IMDb() #by default access the web\n",
    "\n",
    "# Search for a movie (get a list of Movie Objects)\n",
    "results = imdb_object.search_movie('The Matrix')\n",
    "\n",
    "# As this returns a list of all movies containing the word \"The Matrix\", we pick the first element\n",
    "\n",
    "movie = results[0]\n",
    "imdb_object.update(movie)\n",
    "\n",
    "print \"All the information we can get about this movie from IMDB-\"\n",
    "movie.keys()\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The genres associated with the movie are -  [u'Action', u'Sci-Fi']\n"
     ]
    }
   ],
   "source": [
    "print \"The genres associated with the movie are - \",movie['genres']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### A small comparison of IMDB and TMDB \n",
    "Now we have both IMDB and TMDB lets compare them for the same movie"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('The genres for THE MATRIX using IMDB -', [u'Action', u'Sci-Fi'])\n",
      "('The genres for THE MATRIX using TMDB -', [{u'id': 28, u'name': u'Action'}, {u'id': 878, u'name': u'Science Fiction'}])\n"
     ]
    }
   ],
   "source": [
    "print (\"The genres for THE MATRIX using IMDB -\",movie['genres'])\n",
    " \n",
    "print (\"The genres for THE MATRIX using TMDB -\",get_movie_genres_tmdb(\"The Matrix\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As we can see, both the systems are correct, but the way they package information is different. TMDB calls it \"Science Fiction\" and has an ID for every genre. While IMDB calls it \"Sci-Fi\". Thus, it is important to keep track of these things when making use of both the datasets simultaneously.\n",
    "Now that we know how to scrape information for one movie, let's take a bigger step towards scraping multiple movies?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Working with multiple movies : Obtaining Top 20 movies from TMDB\n",
    "We first instantiate an object that inherits from class Movies from TMDB. Then We use the popular() class method (i.e. function) to get top movies. To get more than one page of results, the optional page argument lets us see movies from any specified page number."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "20\n"
     ]
    }
   ],
   "source": [
    "all_movies = tmdb.Movies()\n",
    "top_movies=all_movies.popular()\n",
    "\n",
    "print(len(top_movies['results']))\n",
    "top20_movs = top_movies['results']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dawn of the Planet of the Apes\n",
      "Rise of the Planet of the Apes\n",
      "Guardians of the Galaxy\n",
      "Mad Max: Fury Road\n",
      "Jurassic World\n"
     ]
    }
   ],
   "source": [
    "for i in range(len(top20_movs)):\n",
    "    mov=top20_movs[i]\n",
    "    title = mov['title']\n",
    "    print (title)\n",
    "    if i == 4:\n",
    "        break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[878, 28, 18, 53]\n",
      "[53, 28, 18, 878]\n",
      "[28, 878, 12]\n",
      "[28, 12, 878, 53]\n",
      "[28, 12, 878, 53]\n"
     ]
    }
   ],
   "source": [
    "for i in range(len(top20_movs)):\n",
    "    mov=top20_movs[i]\n",
    "    genre = mov['genre_ids']\n",
    "    print (genre)\n",
    "    if i == 4:\n",
    "        break"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#Create a tmdb genre object!\n",
    "genres=tmdb.Genres()\n",
    "\n",
    "list_of_genres=genres.list()['genres']\n",
    "#print(list_of_genres)\n",
    "\n",
    "\n",
    "Genre_ID_to_name={}\n",
    "for i in range(len(list_of_genres)):\n",
    "    genre_id=list_of_genres[i]['id']\n",
    "    genre_name=list_of_genres[i]['name']\n",
    "    Genre_ID_to_name[genre_id]=genre_name\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Dawn of the Planet of the Apes [u'Science Fiction', u'Action', u'Drama', u'Thriller']\n",
      "Rise of the Planet of the Apes [u'Thriller', u'Action', u'Drama', u'Science Fiction']\n",
      "Guardians of the Galaxy [u'Action', u'Science Fiction', u'Adventure']\n",
      "Mad Max: Fury Road [u'Action', u'Adventure', u'Science Fiction', u'Thriller']\n",
      "Jurassic World [u'Action', u'Adventure', u'Science Fiction', u'Thriller']\n"
     ]
    }
   ],
   "source": [
    "for i in range(len(top20_movs)):\n",
    "    mov=top20_movs[i]\n",
    "    title=mov['title']\n",
    "    genre = mov['genre_ids']\n",
    "    genre_names = []\n",
    "    for id in genre:\n",
    "        genre_name=Genre_ID_to_name[id]\n",
    "        genre_names.append(genre_name)\n",
    "    print title, genre_names\n",
    "    if i == 4:\n",
    "        break;"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Building a dataset to work with: Let's take a look at the top 1000 movies from the database\n",
    "Making use of the same api as before, we will just pull results from the top 50 pages. As mentioned earler, the \"page\" attribute of the command top_movies=all_movies.popilar() can be used for this purpose."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "all_movies=tmdb.Movies()\n",
    "top_movies=all_movies.popular()\n",
    "\n",
    "#print(top_movies)\n",
    "len(top_movies['results'])\n",
    "top20_movs=top_movies['results']\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Done!\n"
     ]
    }
   ],
   "source": [
    "#Comment this code\n",
    "#Saving data in the file\n",
    "#all_movies=tmdb.Movies()\n",
    "#top1000_movies=[]\n",
    "#print('Pulling movie list, Please wait...')\n",
    "\n",
    "#for i in range(1,51):\n",
    "#    if i%15 == 0:\n",
    "#        time.sleep(7)\n",
    "#    movies_on_this_page=all_movies.popular(page=i)['results']\n",
    "#    top1000_movies.extend(movies_on_this_page)\n",
    "#print(len(top1000_movies))\n",
    "#f3 = open('movie_list.pckl','wb')\n",
    "#pickle.dump(top1000_movies,f3)\n",
    "#f3.close()\n",
    "print('Done!')\n",
    "            "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1000\n"
     ]
    }
   ],
   "source": [
    "f3=open('movie_list.pckl','rb')\n",
    "top1000_movies=pickle.load(f3)\n",
    "f3.close()\n",
    "print(len(top1000_movies))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Pairwise analysis of Movie Genres\n",
    "As our dataset is multi-label, simply looking at the distribution of genres is not sufficient. It might be beneficial to see which genres co-occur, as it might shed some light on inherent biases in our dataset. \n",
    "So for the top 1000 movies let's do some pairwise analysis for genre distributions. Our main purpose is to see which genres occur together in the same movie. So, we first define a function which takes a list and makes all possible pairs from it. Then, we pull the list of genres for a movie and run this function on the list of genres to get all pairs of genres which occur together.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Generates all possible pairs of movies \n",
    "def list2pairs(l):\n",
    "    # itertools.combinations(1,2) makes all pairs of length 2 from list l.\n",
    "    pairs=list(itertools.combinations(l,2))\n",
    "    # then the one item pairs, as duplicate pairs aren't accounted for by itertools\n",
    "    for i in l:\n",
    "        pairs.append([i,i])\n",
    "    return pairs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As mentioned, now we will pull genres for each movie, and use above function to count occurrences of when two genres occurred together"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# get all genre list\n",
    "allPairs =[]\n",
    "for movie in top1000_movies:\n",
    "    allPairs.extend(list2pairs(movie['genre_ids']))\n",
    "\n",
    "nr_ids = np.unique(allPairs)\n",
    "visGrid = np.zeros((len(nr_ids), len(nr_ids)))\n",
    "for p in allPairs:\n",
    "    visGrid[np.argwhere(nr_ids==p[0]), np.argwhere(nr_ids==p[1])]+=1\n",
    "    if p[1] != p[0]:\n",
    "        visGrid[np.argwhere(nr_ids==p[1]), np.argwhere(nr_ids==p[0])]+=1\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's take a look at the structure we just made. It is a 19X19 structure, as shown below. Also, see that we had 19 Genres. Needless to say, this structure counts the number of simultaneous occurrences of genres in same movie."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(19, 19)\n",
      "19\n"
     ]
    }
   ],
   "source": [
    "print (visGrid.shape)\n",
    "print(len(Genre_ID_to_name.keys()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f1cd5ad1d90>"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1cd7566950>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "annot_lookup=[]\n",
    "for i in xrange(len(nr_ids)):\n",
    "    annot_lookup.append(Genre_ID_to_name[nr_ids[i]])\n",
    "\n",
    "sns.heatmap(visGrid,xticklabels=annot_lookup,yticklabels=annot_lookup)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The above image shows how often the genres occur together, as a heatmap\n",
    "Important thing to notice in the above plot is the diagonal. The diagonal corresponds to self-pairs, i.e. number of times a genre, say Drama occurred with Drama. Which is basically just a count of the total times that genre occurred!\n",
    "As we can see there are a lot of dramas in the data set, it is also a very unspecific label. There are nearly no documentaries or TV Movies. Horror is a very distinct label, and romance is also not too widely spread.\n",
    "To account for this unbalanced data, there are multiple things we can try to explore what interesting relationships can be found."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.cluster import SpectralCoclustering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nSPSE/wdkKcGcb48q9gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1d08d781d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = SpectralCoclustering(n_clusters=5)\n",
    "model.fit(visGrid)\n",
    "fit_data = visGrid[np.argsort(model.row_labels_)]\n",
    "fit_data = fit_data[:,np.argsort(model.column_labels_)]\n",
    "\n",
    "annot_lookup_sorted =[]\n",
    "for i in np.argsort(model.row_labels_):\n",
    "    annot_lookup_sorted.append(Genre_ID_to_name[nr_ids[i]])\n",
    "\n",
    "sns.heatmap(fit_data,xticklabels=annot_lookup_sorted,yticklabels=annot_lookup_sorted, annot=False)\n",
    "plt.title(\"After biclustering; rearranged to show biclusters\")\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Looking at the above figure, \"boxes\" or groups of movie genres automatically emerge!\n",
    "Intuitively - Sci-Fic, Adventure, Action,Comedy, Family, Drama, Thriller, etc co-occur. AND, Comedy, Animation,Fantasy, Action etc co-occur.\n",
    "That makes a lot of intuitive sense, right?\n",
    "One challenge is the broad range of the drama genre. It makes the two clusters highly overlapping. If we merge it together with action thriller, etc. We will end up with nearly all movies just having that label.\n",
    "\n",
    "**Based on playing around with the stuff above, we can sort the data into the following genre categories - \"Drama, Action, ScienceFiction, exciting(thriller, crime, mystery), uplifting(adventure, fantasy, animation, comedy, romance, family), Horror, History\"**\n",
    "\n",
    "Note: that this categorization is subjective and by no means the only right solution. One could also just stay with the original labels and only exclude the ones with not enough data. Such tricks are important to balance the dataset, it allows us to increase or decrease the strength of certain signals, making it possible to improve our inferences :)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Interesting Questing\n",
    "This really should be a place for you to get creative and hopefully come up with better questions.\n",
    "\n",
    "Here are some of my thoughts:\n",
    "- Which actors are bound to a genre, and which can easily hop genres?\n",
    "- Is there a trend in genre popularity over the years?\n",
    "\n",
    "### Based on this new category set, we will now pull posters from TMDB as our training data!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting pulling movies from TMDB. If you want to debug, uncomment the print command. This will take a while, please wait...\n",
      "('Pulling movies for genre ID: ', 12)\n",
      "('Pulling movies for genre ID: ', 14)\n",
      "('Pulling movies for genre ID: ', 16)\n",
      "('Pulling movies for genre ID: ', 18)\n",
      "('Pulling movies for genre ID: ', 27)\n",
      "('Pulling movies for genre ID: ', 28)\n",
      "('Pulling movies for genre ID: ', 35)\n",
      "('Pulling movies for genre ID: ', 36)\n",
      "('Pulling movies for genre ID: ', 37)\n",
      "('Pulling movies for genre ID: ', 53)\n",
      "('Pulling movies for genre ID: ', 80)\n",
      "('Pulling movies for genre ID: ', 99)\n",
      "('Pulling movies for genre ID: ', 878)\n",
      "('Pulling movies for genre ID: ', 9648)\n",
      "('Pulling movies for genre ID: ', 10402)\n",
      "('Pulling movies for genre ID: ', 10749)\n",
      "('Pulling movies for genre ID: ', 10751)\n",
      "('Pulling movies for genre ID: ', 10752)\n",
      "('Pulling movies for genre ID: ', 10770)\n",
      "Pulled movies for genres - 12,14,16,18,27,28,35,36,37,53,80,99,878,9648,10402,10749,10751,10752,10770\n"
     ]
    }
   ],
   "source": [
    "# Done before, reading from pickle file now to maintain consistency of data!\n",
    "# We now sample 100 movies per genre. Problem is that the sorting is by popular movies, so they will overlap. \n",
    "# Need to exclude movies that were already sampled. \n",
    "movies = []\n",
    "baseyear = 2017\n",
    "print('Starting pulling movies from TMDB. If you want to debug, uncomment the print command. This will take a while, please wait...')\n",
    "done_ids=[]\n",
    "\n",
    "for g_id in nr_ids:\n",
    "    print('Pulling movies for genre ID: ', g_id)\n",
    "    baseyear -=1\n",
    "    for page in xrange(1,6,1):\n",
    "        time.sleep(0.5)\n",
    "        \n",
    "        url = 'https://api.themoviedb.org/3/discover/movie?api_key=' + api_key\n",
    "        url += '&language=en-US&sort_by=popularity.desc&year=' + str(baseyear) \n",
    "        url += '&with_genres=' + str(g_id) + '&page=' + str(page)\n",
    "\n",
    "        data = urllib2.urlopen(url).read()\n",
    "        dataDict = json.loads(data)\n",
    "        movies.extend(dataDict[\"results\"])\n",
    "    done_ids.append(str(g_id))\n",
    "print(\"Pulled movies for genres - \"+','.join(done_ids))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#f6=open(\"movies_for_posters\",'wb')\n",
    "#pickle.dump(movies,f6)\n",
    "#f6.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "f6=open(\"movies_for_posters\", 'rb')\n",
    "movies=pickle.load(f6)\n",
    "f6.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's remove any duplicates that we have in the list of movies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Originally we had  1767  movies\n",
      "Unique movies  1703  movies\n"
     ]
    }
   ],
   "source": [
    "movie_ids = [m['id'] for m in movies]\n",
    "print 'Originally we had ', len(movie_ids), ' movies'\n",
    "movie_ids = np.unique(movie_ids)\n",
    "print 'Unique movies ', len(movie_ids), ' movies'\n",
    "seen_before = []"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
